package com.zf.developaccumulate.utils;

import org.springframework.util.StringUtils;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Objects;

/**
 * LocalDate工具
 */
public class LocalDateUtils {


    /**
     * 由于 LocalDate 会把 错误日期 “2024-09-31” 转换为 “2024-09-30” 且不会抛出异常，
     * 所以编写方法判断日期是否为有效日期，有效则返回转换后的日期，否则返回 null
     *
     * @param dateStr           日期字符串
     * @param dateTimeFormatter 格式化器
     * @return 有效日期，则返回转换后的LocalDate，否则返回 null
     */
    public static LocalDate isValidLocalDate(String dateStr, DateTimeFormatter dateTimeFormatter) {
        if (!StringUtils.hasText(dateStr)) {
            return null;
        }

        LocalDate parse;
        try {
            parse = LocalDate.parse(dateStr, dateTimeFormatter);
        } catch (DateTimeParseException e) {
            return null;
        }

        String format = dateTimeFormatter.format(parse);
        return Objects.equals(dateStr, format) ? parse : null;
    }


    /**
     * 判断两个时间段是否交叉：“两个时间段有交集(一个时间段的开始  = 另一个时间段的结束 也算有交集)” 则判定为交叉
     */
    public static boolean judgeDateCross(LocalDate startDate1, LocalDate endDate1, LocalDate startDate2, LocalDate endDate2) {
        if (Objects.isNull(startDate1) || Objects.isNull(endDate1) || Objects.isNull(startDate2) || Objects.isNull(endDate2)) {
            return false;
        }
        return (!startDate1.isBefore(startDate2) && !startDate1.isAfter(endDate2)) || (!endDate1.isBefore(startDate2) && !endDate1.isAfter(endDate2))
                || (!startDate2.isBefore(startDate1) && !startDate2.isAfter(endDate1)) || (!endDate2.isBefore(startDate1) && !endDate2.isAfter(endDate1));
    }


}
